mod auth;
mod db;
mod handlers;
mod models;
mod templates;

use axum::{
    Router,
    routing::{get, post},
};
use tower_sessions::{MemoryStore, SessionManagerLayer};
// 修改引用：直接使用 tower_sessions 提供的 Key，
// 这样能保证兼容性，前提是 Cargo.toml 里开启了 "signed"
use dotenvy::dotenv;
use tower_sessions::cookie::Key;
// 引用 handler
// use crate::handlers::search_page;

#[tokio::main]
async fn main() {
    dotenv().ok();
    let pool = db::init_db().await;

    // Session 配置
    let session_store = MemoryStore::default();

    // 确保 .env 文件里 SESSION_SECRET 至少有 64 个字符，否则运行会报错
    let secret = std::env::var("SESSION_SECRET").expect("SESSION_SECRET must be set");
    let key = Key::from(secret.as_bytes());

    let session_layer = SessionManagerLayer::new(session_store)
        .with_secure(false) // 开发环境设为 false，生产环境设为 true
        .with_signed(key); // 现在 Cargo.toml 开启了 feature，这个方法可用了

    let app = Router::new()
        .route("/", get(handlers::index_handler))
        .route("/books/add", post(handlers::add_book_handler))
        .route("/books/action", post(handlers::book_action_handler))
        .route("/login", get(auth::login_page).post(auth::login_action))
        .route("/register", post(auth::register_action))
        .route("/logout", get(auth::logout_handler))
        .route("/search", get(handlers::search_page)) // 添加这一行
        .layer(session_layer)
        .with_state(pool);

    let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
    println!("Listening on http://localhost:3000");
    axum::serve(listener, app).await.unwrap();
}
